from django import forms
from .models import User # 注意：如果在 "应用" 目录下，应该是 from .models importUser
from django.contrib.auth import authenticate
# 用户注册表单
class RegisterForm(forms.Form):
    # 用户名字段
    username = forms.CharField(
    required=True, # 必填字段
    max_length=10, # 最多10个字符
    min_length=4, # 至少4个字符
    error_messages={ # 定制错误信息
    'required': "不能为空",
    'max_length': "长度不能大于10",
    'min_length': "长度不能小于4",
    }
)
    # 密码字段
    password = forms.CharField(
    required=True, # 必填字段
    max_length=16, # 最多16个字符
    min_length=8, # 至少8个字符
    error_messages={ # 定制错误信息
    'required': "不能为空",
    'max_length': "长度不能大于16",
    'min_length': "长度不能小于8",
    }
)
# 表单数据整体验证逻辑（例如用户名是否已存在）
    def clean(self):
        username = self.cleaned_data.get('username') # 获取用户名
        user = User.objects.filter(username=username) # 查询数据库中是否已有该用户
        if user.exists(): # 如果用户已存在
            raise forms.ValidationError("用户已存在") # 抛出表单验证错误
            return self.cleaned_data # 返回清洗后的数据
    def save(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = User(username=username)
        user.set_password(password) # 使用 set_password 方法加密密码
        user.save()
# 用户登录表单
class LoginForm(forms.Form):
    # 用户名字段
    username = forms.CharField(
        required=True,
        max_length=10,
        min_length=4,
        error_messages={
            'required': "不能为空",
            'max_length': "长度不能大于10",
            'min_length': "长度不能小于4",
        }
    )
    # 密码字段
    password = forms.CharField(
    required=True,
    max_length=16,
    min_length=8,
    error_messages={
    'required': "不能为空",
    'max_length': "长度不能大于16",
    'min_length': "长度不能小于8",
        }
    )
    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if user is None:
            raise forms.ValidationError("用户名或密码错误")
        return self.cleaned_data
